﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using GSQ.BusinessEntities;
using GSQ.DataAccess.DataSetTableAdapters;

namespace GSQ.DataAccess
{
    public class CotizacionesDA
    {
        #region Variables
        private COTIZACIONESTableAdapter AdapterMaster = new COTIZACIONESTableAdapter();
        private COTIZACIONES_DETALLESTableAdapter AdapterDetaill = new COTIZACIONES_DETALLESTableAdapter();

        private V_COTIZACIONESTableAdapter vAdapterMaster = new V_COTIZACIONESTableAdapter();
        private V_COTIZACIONES_DETALLESTableAdapter vAdapterDetaill = new V_COTIZACIONES_DETALLESTableAdapter();

        private SECUENCIASTableAdapter AdapterSecuencias = new SECUENCIASTableAdapter();             

        private DataSet.COTIZACIONESDataTable entitiesMaster;
        private DataSet.COTIZACIONES_DETALLESDataTable entitiesDetaill;

        private DataSet.COTIZACIONESRow entityMaster;
        private DataSet.COTIZACIONES_DETALLESRow entityDetaill;

        private DataSet.SECUENCIASRow entitySecuencia;
        
        #endregion

        public decimal Insert(COTIZACIONES value)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open(); // abro la conexion
                    AdapterMaster.Connection = cnn; // asignar la conexion al tableAdapter principal

                    SqlTransaction tr = cnn.BeginTransaction(); // Creo la transaccion y la inicializo con la conexion
                    AdapterMaster.Transaction = tr; // Asigno  la transaccion al tableAdapter principal

                    AdapterSecuencias.Connection = cnn; // Asigno la conexion a tableAdapter que maneja las secuencias
                    AdapterSecuencias.Transaction = tr; // Asigno la transaccion tableAdapter que maneja las secuencias

                    entitySecuencia = AdapterSecuencias.GetDataByID(4).FirstOrDefault();// Obtengo el valor de secuencia en su tabla correspondiente
                                       
                    entitiesMaster = new DataSet.COTIZACIONESDataTable(); // Inicializo la tabla principal 
                    entityMaster = entitiesMaster.NewCOTIZACIONESRow(); // Inicializo la fila principal apartir de la tabla principal


                    entityMaster.ID = entitySecuencia.VALUE + 1;// Asigno el valor de secuencia mas 1
                    entityMaster.ID_CLIENTE = value.ID_CLIENTE;
                    entityMaster.ID_VENDEDOR = value.ID_VENDEDOR;
                    entityMaster.ID_USUARIO = value.ID_USUARIO;                    
                    entityMaster.FECHA = value.FECHA;                     
                    entityMaster.ACTIVO = value.ACTIVO;
                    if (value.OBSERVACIONES != null && value.OBSERVACIONES != string.Empty)
                        entityMaster.OBSERVACIONES = value.OBSERVACIONES;
                    entityMaster.T_IMPUESTO = value.T_IMPUESTO;
                    entityMaster.T_DESCUENTO = value.T_DESCUENTO;
                    entityMaster.M_TOTAL = value.M_TOTAL;
                 

                    entitiesMaster.AddCOTIZACIONESRow(entityMaster); //Agrego la fila principal a la tabla principal
                    try
                    {
                        AdapterMaster.Update(entitiesMaster); // Ejecuto la operacion de update para insertar el encabezado 
                        AdapterSecuencias.SecuenciasUpdateCommand(4);                       

                        AdapterDetaill.Connection = cnn; // Asigno la conexion al tableAdapter de detalle 
                        AdapterDetaill.Transaction = tr; // Asigno la transaccion al tableAdapter de detalle       

                        entitiesDetaill = new DataSet.COTIZACIONES_DETALLESDataTable ();
                        foreach (COTIZACIONES_DETALLES  rw in value.COTIZACIONES_DETALLES)
                        {
                            entityDetaill = entitiesDetaill.NewCOTIZACIONES_DETALLESRow();

                            entityDetaill.ID = entityMaster.ID;
                            entityDetaill.ID_PRODUCTO = rw.ID_PRODUCTO;
                            entityDetaill.CANTIDAD = rw.CANTIDAD;
                            entityDetaill.COSTO = rw.COSTO;
                            entityDetaill.PRECIO = rw.PRECIO;
                            entityDetaill.DESCUENTO = rw.DESCUENTO;
                            entityDetaill.X_DESCUENTO = rw.X_DESCUENTO;
                            entityDetaill.IMPUESTO = rw.IMPUESTO;
                            entityDetaill.X_IMPUESTO = rw.X_IMPUESTO;
                          
                            entitiesDetaill.AddCOTIZACIONES_DETALLESRow (entityDetaill);
                        }
                        AdapterDetaill.Update(entitiesDetaill);                      

                        tr.Commit();
                    }
                    catch (Exception ex)
                    {
                        tr.Rollback();
                        throw ex;
                    }

                    value.ID = entityMaster.ID;
                    return value.ID;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public decimal Update(COTIZACIONES newValue, COTIZACIONES oldValue)
        {
            throw new NotImplementedException();
            //using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            //{
            //    try
            //    {
            //        cnn.Open(); // abro la conexion
            //        AdapterMaster.Connection = cnn; // asignar la conexion al tableAdapter principal

            //        SqlTransaction tr = cnn.BeginTransaction(); // Creo la transaccion y la inicializo con la conexion
            //        AdapterMaster.Transaction = tr; // Asigno  la transaccion al tableAdapter principal

            //        entitiesMaster = this.AdapterMaster.GetDataByID(oldValue.ID);
            //        entityMaster = this.entitiesMaster.FirstOrDefault(); // Inicializo la fila principal apartir de la tabla principal

            //        entityMaster.ID_CONDICION = newValue.ID_CONDICION;
            //        entityMaster.TIPO = newValue.TIPO;
            //        entityMaster.ID_USUARIO = newValue.ID_USUARIO;
            //        entityMaster.FECHA = newValue.FECHA;
            //        entityMaster.F_VENCIMIENTO = newValue.F_VENCIMIENTO;
            //        entityMaster.ID_SUPLIDOR = newValue.ID_SUPLIDOR;
            //        entityMaster.NRO_FACTURA = newValue.NRO_FACTURA;
            //        if (newValue.NCF != null && newValue.NCF != string.Empty)
            //            entityMaster.NCF = newValue.NCF;
            //        if (newValue.OBSERVACIONES != null && newValue.OBSERVACIONES != string.Empty)
            //            entityMaster.OBSERVACIONES = newValue.OBSERVACIONES;
            //        entityMaster.ACTIVO = newValue.ACTIVO;

            //        try
            //        {
            //            AdapterMaster.Update(entitiesMaster); // Ejecuto la operacion de update para insertar el encabezado 

            //            AdapterDetaill.Connection = cnn; // Asigno la conexion al tableAdapter de detalle 
            //            AdapterDetaill.Transaction = tr; // Asigno la transaccion al tableAdapter de detalle                        

            //            DataSet.UTILIDADESRow utilidades = new DataSetTableAdapters.UTILIDADESTableAdapter { Connection = cnn, Transaction = tr }.GetData().FirstOrDefault();

            //            AdapterProductos.Connection = cnn;
            //            AdapterProductos.Transaction = tr;


            //            DataSet.COMPRAS_DETALLESDataTable comprasDetalles = AdapterDetaill.GetDataByID(oldValue.ID);
            //            foreach (DataSet.COMPRAS_DETALLESRow r in comprasDetalles)
            //            {
            //                AdapterProductos.ProductosUpdateExistencia((r.CANTIDAD * -1), r.ID_PRODUCTO);
            //            }
            //            AdapterDetaill.DeleteByID(oldValue.ID);
            //            entitiesDetaill = new DataSet.COMPRAS_DETALLESDataTable();

            //            foreach (COMPRAS_DETALLES rw in newValue.COMPRAS_DETALLES)
            //            {
            //                entityDetaill = entitiesDetaill.NewCOMPRAS_DETALLESRow();
            //                AdapterProductos.ProductosUpdateExistencia(rw.CANTIDAD, rw.ID_PRODUCTO);
            //                DataSet.PRODUCTOSRow producto = AdapterProductos.GetDataByID(rw.ID_PRODUCTO).FirstOrDefault();
            //                entityDetaill.COSTO_ANTERIOR = producto.COSTO;
            //                entityDetaill.PRECIO_ANTERIOR = producto.PRECIO;
            //                if (utilidades.AJUSTAR_PRECIOS_COSTO_COMPRAS)
            //                {
            //                    producto.COSTO = rw.COSTO;
            //                    producto.PRECIO = rw.COSTO + ((rw.COSTO * producto.X_GANANCIA) / 100);
            //                    AdapterProductos.Update(producto);
            //                }



            //                entityDetaill.ID = entityMaster.ID;
            //                entityDetaill.ID_PRODUCTO = rw.ID_PRODUCTO;
            //                entityDetaill.CANTIDAD = rw.CANTIDAD;
            //                entityDetaill.COSTO = rw.COSTO;
            //                entityDetaill.PRECIO = rw.PRECIO;
            //                entityDetaill.DESCUENTO = rw.DESCUENTO;
            //                entityDetaill.X_DESCUENTO = rw.X_DESCUENTO;
            //                entityDetaill.IMPUESTO = rw.IMPUESTO;
            //                entityDetaill.X_IMPUESTO = rw.X_IMPUESTO;
            //                entityDetaill.C_DEVUELTA = rw.C_DEVUELTA;
            //                entitiesDetaill.AddCOMPRAS_DETALLESRow(entityDetaill);
            //            }
            //            AdapterDetaill.Update(entitiesDetaill);
            //            tr.Commit();
            //        }
            //        catch (Exception ex)
            //        {
            //            tr.Rollback();
            //            throw ex;
            //        }

            //        newValue.ID = entityMaster.ID;
            //        return newValue.ID;
            //    }
            //    finally
            //    {
            //        if (cnn.State != System.Data.ConnectionState.Closed)
            //            cnn.Close();
            //    }
            //}
        }        

        public COTIZACIONES GetById(decimal id)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vAdapterMaster.Connection = cnn;

                    DataSet.V_COTIZACIONESRow rw = vAdapterMaster.GetDataByID(id).FirstOrDefault();
                    COTIZACIONES factura = null;
                    if (rw != null)
                    {
                        vAdapterDetaill.Connection = cnn;
                        factura = GetEntity(rw, vAdapterDetaill.GetDataByID(rw.ID));
                    }
                    return factura;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public List<COTIZACIONES> GetAll()
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vAdapterMaster.Connection = cnn;
                    List<COTIZACIONES> list = new List<COTIZACIONES>();
                    foreach (DataSet.V_COTIZACIONESRow rw in vAdapterMaster.GetData())
                    {
                        list.Add(GetEntity(rw, null));
                    }
                    return list;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public List<COTIZACIONES> GetByFechas(DateTime value1, DateTime value2)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vAdapterMaster.Connection = cnn;
                    List<COTIZACIONES> list = new List<COTIZACIONES>();
                    foreach (DataSet.V_COTIZACIONESRow rw in vAdapterMaster.GetDataByFechas(value1.Date, value2.Date))
                    {
                        list.Add(GetEntity(rw, null));
                    }
                    return list;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public List<COTIZACIONES> GetByCliente(decimal id)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vAdapterMaster.Connection = cnn;
                    List<COTIZACIONES> list = new List<COTIZACIONES>();
                    foreach (DataSet.V_COTIZACIONESRow rw in vAdapterMaster.GetDataByIdCliente(id))
                    {
                        list.Add(GetEntity(rw, null));
                    }
                    return list;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public List<COTIZACIONES> GetByCliente(string value)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vAdapterMaster.Connection = cnn;
                    List<COTIZACIONES> list = new List<COTIZACIONES>();
                    foreach (DataSet.V_COTIZACIONESRow rw in vAdapterMaster.GetDataByCliente(value.Trim()))
                    {
                        list.Add(GetEntity(rw, null));
                    }
                    return list;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }        

        private COTIZACIONES GetEntity(DataSet.V_COTIZACIONESRow rwMaster, DataSet.V_COTIZACIONES_DETALLESDataTable tdDetaill)
        {
            COTIZACIONES factura = null;
            if (rwMaster != null)
            {
                factura = new COTIZACIONES();
                factura.ID = rwMaster.ID;                                           
                factura.ID_CLIENTE = rwMaster.ID_CLIENTE;
                factura.CLIENTES = new CLIENTES { ID = rwMaster.ID_CLIENTE, CLIENTE = rwMaster.CLIENTE };
                factura.ID_VENDEDOR = rwMaster.ID_VENDEDOR;
                factura.VENDEDORES = new VENDEDORES { ID = rwMaster.ID_VENDEDOR, VENDEDOR = rwMaster.VENDEDOR };
                factura.ID_USUARIO = rwMaster.ID_USUARIO;
                factura.USUARIOS = new USUARIOS { ID = rwMaster.ID_USUARIO, NOMBRE_USUARIO = rwMaster.USUARIO };             
                factura.FECHA = rwMaster.FECHA;                  
                if (!rwMaster.IsOBSERVACIONESNull())
                    factura.OBSERVACIONES = rwMaster.OBSERVACIONES;
                factura.ACTIVO = rwMaster.ACTIVO;
                factura.T_DESCUENTO = rwMaster.T_DESCUENTO;
                factura.T_IMPUESTO = rwMaster.T_IMPUESTO;
                factura.M_TOTAL = rwMaster.M_TOTAL;
         
                if (tdDetaill != null)
                {
                    foreach (DataSet.V_COTIZACIONES_DETALLESRow rw in tdDetaill)
                    {
                        if (rw != null)
                        {
                            COTIZACIONES_DETALLES cotizacionesdetalle = new COTIZACIONES_DETALLES();
                            cotizacionesdetalle.ID = rw.ID;
                            cotizacionesdetalle.ID_PRODUCTO = rw.ID_PRODUCTO;
                            cotizacionesdetalle.PRODUCTOS = new PRODUCTOS { ID = rw.ID_PRODUCTO, CODIGO = rw.CODIGO };
                            cotizacionesdetalle.MEDIDAS = new MEDIDAS { ID = rw.ID_MEDIDA, MEDIDA = rw.MEDIDA };
                            cotizacionesdetalle.DESCRIPCIONES = new DESCRIPCIONES { ID = rw.ID_DESCRIPCION, DESCRIPCION = rw.DESCRIPCION };
                            cotizacionesdetalle.CANTIDAD = rw.CANTIDAD;
                            cotizacionesdetalle.COSTO = rw.COSTO;
                            cotizacionesdetalle.PRECIO = rw.PRECIO;
                            cotizacionesdetalle.DESCUENTO = rw.DESCUENTO;
                            cotizacionesdetalle.X_DESCUENTO = rw.X_DESCUENTO;
                            cotizacionesdetalle.IMPUESTO = rw.IMPUESTO;
                            cotizacionesdetalle.X_IMPUESTO = rw.X_IMPUESTO;
                       
                            factura.COTIZACIONES_DETALLES.Add(cotizacionesdetalle);
                        }
                    }

                }
            }
            return factura;
        }        
    }
}
